package util.sort;

import java.lang.reflect.Field;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;

/**
 * 排序 工具类
 * @Author zt
 * @date 2021/11/17 10:49
 * @Version 1.0
 */
public class SortUtil {

    /**
     * 对集合中是对象的排序
     *
     * @param list 数据源
     * @param param 需要排序的参数名
     * @param sort 排序字段 desc代表倒序
     * @return 结果
     */
    public static List<?> listSort(List<?> list, String param, String sort) {
        Collections.sort(list, new Comparator<Object>() {
            @Override
            public int compare(Object o1, Object o2) {
                try {
                    Field field1 = o1.getClass().getDeclaredField(param);
                    field1.setAccessible(true);
                    String o1s = field1.get(o1).toString();
                    Field field2 = o2.getClass().getDeclaredField(param);
                    field2.setAccessible(true);
                    String o2s = field2.get(o2).toString();
                    return sortAD(sort, o1s, o2s);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return 0;

            }
        });
        return list;
    }

    /**
     * 对集合中是map的排序
     *
     * @param list 数据源
     * @param param  需要排序的参数名
     * @param sort 排序字段 desc代表倒序
     * @return 结果
     */
    public static List<Map<String,Object>> MapSort(List<Map<String,Object>> list, String param, String sort) {
        Collections.sort(list, new Comparator<Map>() {
            @Override
            public int compare(Map o1, Map o2) {
                String o1s = o1.get(param).toString();
                String o2s = o2.get(param).toString();
                return sortAD(sort, o1s, o2s);
            }
        });
        return list;
    }

    /**
     * 确定排序顺序
     *
     * @param sort 源数据
     * @param o1s  参数1
     * @param o2s 参数2
     * @return 结果
     */
    private static int sortAD(String sort, String o1s, String o2s) {
        if (sort.equals("desc")) {
            if (o1s.compareTo(o2s) < 0) {
                return 1;
            } else if (o1s.compareTo(o2s) == 0) {
                return 0;
            } else if (o1s.compareTo(o2s) > 0) {
                return -1;
            }
        } else {
            if (o1s.compareTo(o2s) < 0) {
                return -1;
            } else if (o1s.compareTo(o2s) == 0) {
                return 0;
            } else if (o1s.compareTo(o2s) > 0) {
                return 1;
            }
        }
        return 0;
    }

}
